/**
 * 灯光模式管理服务
 * 用于管理灯光模式的状态和切换
 */

const storageService = require('./storage')

// 灯光模式类型常量
const LIGHT_MODE_TYPES = {
  // 自动模式
  AUTO: 'auto',
  // 手动模式
  MANUAL: 'manual',
}

// 当前灯光模式常量
const CURRENT_LIGHT_MODES = {
  // 手动快捷模式
  MANUAL_SHORTCUT: 'manual_shortcut',
  // 手动玩家模式
  MANUAL_PLAYER: 'manual_player',
}

// 存储键名
const STORAGE_KEYS = {
  // 当前灯光模式（手动快捷模式/手动玩家模式）
  CURRENT_LIGHT_MODE: 'currentLightMode',
}

/**
 * 获取存储键名
 * @param {string} keyType - 存储键类型
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @returns {string} 完整的存储键名
 */
function getStorageKey(keyType, id, isGroup = false) {
  // 确保id是有效的
  if (!id) {
    console.error('getStorageKey: 无效的ID', id)
    id = 'unknown'
  }

  // 检查id是否已经包含group_前缀，避免重复添加
  const hasGroupPrefix = typeof id === 'string' && id.startsWith('group_')

  // 构建带有设备/编组ID的键名
  // 如果是编组且ID没有group_前缀，则添加前缀
  const prefix = isGroup && !hasGroupPrefix ? `group_${id}` : id

  // 记录生成的键名，帮助调试
  const key = `${keyType}_${prefix}`
  console.log(`生成存储键名: ${key}, 原始ID: ${id}, 是否编组: ${isGroup}`)

  return key
}

/**
 * 获取当前灯光模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @returns {string} 当前灯光模式，默认为手动快捷模式
 */
function getCurrentLightMode(id, isGroup = false) {
  const key = getStorageKey(STORAGE_KEYS.CURRENT_LIGHT_MODE, id, isGroup)
  return wx.getStorageSync(key) || CURRENT_LIGHT_MODES.MANUAL_SHORTCUT // 默认为手动快捷模式
}

/**
 * 保存当前灯光模式
 * @param {string} id - 设备ID或编组ID
 * @param {string} mode - 当前灯光模式
 * @param {boolean} isGroup - 是否为编组
 */
function saveCurrentLightMode(id, mode, isGroup = false) {
  const key = getStorageKey(STORAGE_KEYS.CURRENT_LIGHT_MODE, id, isGroup)
  wx.setStorageSync(key, mode)
}

/**
 * 检查是否为手动模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @returns {boolean} 是否为手动模式
 */
function isManualMode(id, isGroup = false) {
  return storageService.getLightModeState(id) === LIGHT_MODE_TYPES.MANUAL
}

/**
 * 检查是否为自动模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @returns {boolean} 是否为自动模式
 */
function isAutoMode(id, isGroup = false) {
  return storageService.getLightModeState(id) === LIGHT_MODE_TYPES.AUTO
}

/**
 * 检查是否为手动快捷模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @returns {boolean} 是否为手动快捷模式
 */
function isManualShortcutMode(id, isGroup = false) {
  return (
    isManualMode(id, isGroup) &&
    getCurrentLightMode(id, isGroup) === CURRENT_LIGHT_MODES.MANUAL_SHORTCUT
  )
}

/**
 * 检查是否为手动玩家模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @returns {boolean} 是否为手动玩家模式
 */
function isManualPlayerMode(id, isGroup = false) {
  return (
    isManualMode(id, isGroup) &&
    getCurrentLightMode(id, isGroup) === CURRENT_LIGHT_MODES.MANUAL_PLAYER
  )
}

/**
 * 设置为手动快捷模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 */
function setManualShortcutMode(id, isGroup = false) {
  storageService.saveLightModeState(id, LIGHT_MODE_TYPES.MANUAL, isGroup)
  saveCurrentLightMode(id, CURRENT_LIGHT_MODES.MANUAL_SHORTCUT, isGroup)
}

/**
 * 设置为手动玩家模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 */
function setManualPlayerMode(id, isGroup = false,deviceType) {
  storageService.saveLightModeState(id, LIGHT_MODE_TYPES.MANUAL, isGroup,deviceType)
  saveCurrentLightMode(id, CURRENT_LIGHT_MODES.MANUAL_PLAYER, isGroup)
}

/**
 * 设置为自动模式
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 */
function setAutoMode(id, isGroup = false) {
  storageService.saveLightModeState(id, LIGHT_MODE_TYPES.AUTO, isGroup)
  // 自动模式下不需要设置当前灯光模式，因为当前灯光模式只在手动模式下有意义
}

/**
 * 更新设备或编组的总开关状态
 * @param {string} id - 设备ID或编组ID
 * @param {boolean} isGroup - 是否为编组
 * @param {boolean} state - 总开关状态
 */
function updateTotalSwitchState(id, isGroup = false, state) {
  if (isGroup) {
    // 更新编组的总开关状态
    const groups = storageService.getGroups()
    const groupIndex = groups.findIndex(g => g.id === id)
    if (groupIndex !== -1) {
      groups[groupIndex].totalSwitch = state
      storageService.saveGroups(groups)
    }
  } else {
    // 更新设备的总开关状态
    const devices = storageService.getDevices()
    const deviceIndex = devices.findIndex(d => d.id === id)
    if (deviceIndex !== -1) {
      devices[deviceIndex].totalSwitch = state
      storageService.saveDevices(devices)
    }
  }
}

module.exports = {
  LIGHT_MODE_TYPES,
  CURRENT_LIGHT_MODES,
  getCurrentLightMode,
  saveCurrentLightMode,
  isManualMode,
  isAutoMode,
  isManualShortcutMode,
  isManualPlayerMode,
  setManualShortcutMode,
  setManualPlayerMode,
  setAutoMode,
  updateTotalSwitchState,
}
